package com.server.net;

import com.msg.MsgMain;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.protobuf.ProtobufDecoder;
import io.netty.handler.codec.protobuf.ProtobufEncoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * 自定义初始化器
 */
public class NettyProtobufServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel socketChannel) {
        ChannelPipeline pipeline = socketChannel.pipeline();
        //为管道增加拦截器/监听器
        pipeline.addLast(new IdleStateHandler(300, 0, 0)); //心跳
        /**
         * protobufDecoder仅仅负责编码，并不支持读半包，所以在之前，一定要有读半包的处理器。
         * 有三种方式可以选择：
         * 使用netty提供ProtobufVarint32FrameDecoder
         * 继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder
         * 继承ByteToMessageDecoder类，自己处理半包
         */
        // 半包的处理
        pipeline.addLast(new ProtobufVarint32FrameDecoder());//解码器
        // 需要解码的目标类
        pipeline.addLast(new ProtobufDecoder(MsgMain.MainProtocl.getDefaultInstance()));
        pipeline.addLast(new ProtobufVarint32LengthFieldPrepender());//编码器
        pipeline.addLast(new ProtobufEncoder());
        pipeline.addLast(new NettyProtobufServerHandler());
    }
}
